块状链表模板题,但出奇的恶心
由于一些操作会产生或删去一些块,所以对于块的产生与删去,块的编号用内存池分配
先给出几个操作,添加块($add$),查询属于哪个块($belong$),分裂($split$),合并($merge$),具体细节看代码分析.
下面对题目给的操作进行分析
$1.Move~k$ 将光标移动到第 $k$个字符之后
直接移动即可1
pos=read();
$2.Insert~n~s$ 在光标处插入长度为$n$的字符串$s$,光标位置不变
将插入串分块,最后一块(即剩余块,唯一的一块长度不一定是$size$的块)与它后面那一块判断一下,如果长度相加后$<size$,那么就合并.
并且我们很可能在块内插入,那我们就要将这个块从插入位置$split$,然后进行插入。
$3.Delete~n$ 删除光标后的n个字符,光标位置不变
先将两端所在的块分裂,然后直接删除,并且对两端分类出的块长度和进行判断,如果$<size$,就进行$merge$操作。
$4.Get~n$ 输出光标后的$n$个字符,光标位置不变
只需把左边块和右边块的需要部分给截出来,与中间完整的块拼在一起输出即可
$5.Prev$ 光标前移一个字符
直接移动即可1
--pos;
$6.Next$ 光标后移一个字符
直接移动即可1
++pos;
$Code:$
1 |
|